package control;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;

import service.ProjetoService;
import service.RecursoService;
import service.RequisitoService;
import entity.Atividade;
import entity.CasoUso;
import entity.Execucao;
import entity.Iteracao;
import entity.Projeto;
import entity.Recurso;
import entity.Requisito;

@Named
@SessionScoped
public class AcompanharProjetoControl implements Serializable {
	private static final long serialVersionUID = 5305099696001838834L;

	@Inject
	private MenuControl menu;
	
	@EJB
	private ProjetoService projetoService;
	
	@EJB
	private RecursoService recursoService;
	
	@EJB
	private RequisitoService requisitoService;
	
	private Projeto projeto;
	private Long idIteracaoSelecionada;
	private List<Iteracao> iteracoes;
	private Iteracao iteracaoCorrente;
	
	private Iteracao iteracao;
	private List<Requisito> requisitosDaIteracao;
	private List<Recurso> recursosDaIteracao;
	private List<CasoUso> casosUsoDaIteracao;
	
	private Long idAtividadeSelecionada;
	private Atividade atividade;
	private List<Requisito> requisitosDaAtividade;
	private List<Atividade> atividadesPredecessoras;
	private Long idRequisitoSelecionado;
	private Requisito requisito;
	private List<Atividade> atividadesDoRequisito;
	private List<Execucao> execucoesDaAtividade;
	private List<Execucao> execucoesDaIteracao;
	private List<CasoUso> casosUsoDaAtividade;
	
	private Date dataInicioIteracao;
	private Date dataConclusaoIteracao;
	
	private boolean desabBtPlanejar;
	private boolean desabBtIniciar;
	private boolean desabBtConcluir;
	private boolean desabBtReplanejar;
	
	public String iniciar() {
		projeto = projetoService.obterProjetoCompleto(menu.getIdProjetoSelecionado());
		iteracoes = projeto.getIteracoes();
		iteracaoCorrente = projetoService.obterIteracaoCorrente(menu.getIdProjetoSelecionado());
		
		return "/pages/projeto/acompanhar_projeto";
	}

	public String visualizarIteracao() {
		iteracao = projetoService.obterIteracaoComAtividadesERecursos(idIteracaoSelecionada);
		recursosDaIteracao = recursoService.listarRecursosDaIteracao(idIteracaoSelecionada);
		requisitosDaIteracao = requisitoService.listarRequisitosDaIteracao(idIteracaoSelecionada);
		execucoesDaIteracao = projetoService.listarExecucoesDaIteracao(idIteracaoSelecionada);
		casosUsoDaIteracao = requisitoService.listarCasosUsoDaIteracao(idIteracaoSelecionada);
		
		desabBtPlanejar = !iteracao.podePlanejar();
		desabBtIniciar = !iteracao.podeIniciar();
		desabBtConcluir = !iteracao.podeConcluir();
		desabBtReplanejar = !iteracao.podeReplanejar();
		
		return "/pages/projeto/acompanhar_iteracao";
	}
	
	public String listarRequisitosDaAtividade() {
		atividade = projetoService.obterAtividade(idAtividadeSelecionada);
		requisitosDaAtividade = requisitoService.listarRequisitosDaAtividade(idAtividadeSelecionada);
		casosUsoDaAtividade = requisitoService.listarCasosUsoDaAtividade(idAtividadeSelecionada);
		
		return "";
	}
	
	public String listarAtividadesPredecessoras() {
		atividade = projetoService.obterAtividade(idAtividadeSelecionada);
		atividadesPredecessoras = projetoService.listarAtividadesPredecessorasA(idAtividadeSelecionada);
		return "";
	}
	
	public String listarAtividadesDoRequisito() {
		requisito = requisitoService.obterRequisito(idRequisitoSelecionado);
		atividadesDoRequisito = projetoService.listarAtividadesDoRequisitoNaIteracao(idRequisitoSelecionado, idIteracaoSelecionada);
		
		return "";
	}
	
	public String listarExecucoesDaAtividade() {
		atividade = projetoService.obterAtividade(idAtividadeSelecionada);
		execucoesDaAtividade = projetoService.listarExecucoesDaAtividade(idAtividadeSelecionada);
		
		return "";
	}
	
	public String confirmarInicioIteracao() {
		dataInicioIteracao = iteracao.getInicio();
		
		return "";
	}
	
	public String iniciarIteracao() {
		projetoService.iniciarIteracao(idIteracaoSelecionada, dataInicioIteracao);
		
		return iniciar();
	}
	
	public String cancelarAtividade() {
		projetoService.cancelarAtividade(idAtividadeSelecionada);
		iteracao = projetoService.obterIteracaoComAtividadesERecursos(idIteracaoSelecionada);
		
		return "";
	}
	
	public String confirmarConclusaoIteracao() {
		dataConclusaoIteracao = iteracao.getFim();
		
		return "";
	}
	
	public String concluirIteracao() {
		projetoService.concluirIteracao(idIteracaoSelecionada, dataConclusaoIteracao);
		
		return iniciar();
	}
	
	
	
	public Long getIdIteracaoSelecionada() {
		return idIteracaoSelecionada;
	}

	public void setIdIteracaoSelecionada(Long idIteracaoSelecionada) {
		this.idIteracaoSelecionada = idIteracaoSelecionada;
	}

	public Projeto getProjeto() {
		return projeto;
	}
	
	public List<Iteracao> getIteracoes() {
		return iteracoes;
	}
	
	public Iteracao getIteracao() {
		return iteracao;
	}

	public List<Requisito> getRequisitosDaIteracao() {
		return requisitosDaIteracao;
	}

	public List<Recurso> getRecursosDaIteracao() {
		return recursosDaIteracao;
	}

	public Long getIdAtividadeSelecionada() {
		return idAtividadeSelecionada;
	}

	public void setIdAtividadeSelecionada(Long idAtividadeSelecionada) {
		this.idAtividadeSelecionada = idAtividadeSelecionada;
	}

	public List<Requisito> getRequisitosDaAtividade() {
		return requisitosDaAtividade;
	}

	public List<Atividade> getAtividadesPredecessoras() {
		return atividadesPredecessoras;
	}

	public Atividade getAtividade() {
		return atividade;
	}

	public Requisito getRequisito() {
		return requisito;
	}

	public List<Atividade> getAtividadesDoRequisito() {
		return atividadesDoRequisito;
	}

	public Long getIdRequisitoSelecionado() {
		return idRequisitoSelecionado;
	}

	public void setIdRequisitoSelecionado(Long idRequisitoSelecionado) {
		this.idRequisitoSelecionado = idRequisitoSelecionado;
	}

	public boolean isDesabBtPlanejar() {
		return desabBtPlanejar;
	}

	public boolean isDesabBtIniciar() {
		return desabBtIniciar;
	}

	public boolean isDesabBtConcluir() {
		return desabBtConcluir;
	}

	public boolean isDesabBtReplanejar() {
		return desabBtReplanejar;
	}

	public List<Execucao> getExecucoesDaAtividade() {
		return execucoesDaAtividade;
	}

	public Date getDataConclusaoIteracao() {
		return dataConclusaoIteracao;
	}

	public void setDataConclusaoIteracao(Date dataConclusaoIteracao) {
		this.dataConclusaoIteracao = dataConclusaoIteracao;
	}

	public Iteracao getIteracaoCorrente() {
		return iteracaoCorrente;
	}

	public Date getDataInicioIteracao() {
		return dataInicioIteracao;
	}

	public void setDataInicioIteracao(Date dataInicioIteracao) {
		this.dataInicioIteracao = dataInicioIteracao;
	}

	public List<Execucao> getExecucoesDaIteracao() {
		return execucoesDaIteracao;
	}

	public List<CasoUso> getCasosUsoDaIteracao() {
		return casosUsoDaIteracao;
	}

	public List<CasoUso> getCasosUsoDaAtividade() {
		return casosUsoDaAtividade;
	}
}
